package com.atguigu.spzx.manager.helper;

import com.atguigu.spzx.model.entity.system.SysMenu;
import com.atguigu.spzx.model.vo.system.SysMenuVo;
import org.springframework.util.CollectionUtils;

import java.util.ArrayList;
import java.util.List;

/**
 * @author Mahone
 */
public class MenuHelper {
    /**
     * 使用递归方法建菜单
     * @param sysMenuList
     * @return
     */
    public static List<SysMenu> buildTree(List<SysMenu> sysMenuList) {
        // 创建一个集合TreeMenu，用来存储其下属子节点
        List<SysMenu> treeMenu = new ArrayList<>();
        // 遍历找出parent_id为0的根节点
        for (SysMenu sysMenu : sysMenuList) {
            if (sysMenu.getParentId().longValue() == 0){
                // 找到将该值赋给treeMenu
                // 并继续判断其是否有子节点
                treeMenu.add(findChildren(sysMenu,sysMenuList));
            }
        }
        return treeMenu;
    }

    /**
     * 递归查找子节点
     * @param treeNodes
     * @return
     */
    private static SysMenu findChildren(SysMenu sysMenu, List<SysMenu> treeNodes) {
        // 遍历
        for (SysMenu menu : treeNodes) {
            // 在集合中查找元素的parentId的值是否与根元素的主键id相等
            if (sysMenu.getId().longValue() == menu.getParentId().longValue()){
                // 如果相等则表示找到根节点的子节点
                // 递归继续找子节点的孩子
                sysMenu.getChildren().add(findChildren(menu,treeNodes));
            }

        }
        return sysMenu;
    }

    public static List<SysMenuVo> buildVoTree(List<SysMenu> sysMenuListTree) {
        // 将数据库的SysMenu集合对象转成SysMenuVo对象
        List<SysMenuVo> sysMenuVoList = new ArrayList<>();
        for (SysMenu sysMenu : sysMenuListTree) {
            SysMenuVo sysMenuVo = new SysMenuVo();
            sysMenuVo.setName(sysMenu.getComponent());
            sysMenuVo.setTitle(sysMenu.getTitle());
            if (!CollectionUtils.isEmpty(sysMenu.getChildren())){
                sysMenuVo.setChildren(buildVoTree(sysMenu.getChildren()));
            }
            // 走到这说明没有子节点
            sysMenuVoList.add(sysMenuVo);
        }
        return sysMenuVoList;
    }
}
